package xmlGen;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import modele.Contact;
import modele.Event;
import modele.Owner;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class XMLJdomCreater {

	private final static String NAME = "Agenda.xml";
	private Element root;
	private Document document;
	private String fileName;
	private JDomElementCreater elementAdder;
	
	
	/**
	 * Cree ou ouvre le fichier xml pour
	 * la sauvegarde des {@link Contact}s, {@link Event}s, ...
	 * @param name Nom du fichier de sauvegarde
	 */
	public XMLJdomCreater(String name) {
		
		this.fileName = name + NAME;
		/*if(!name.endsWith(".xml")) {
			this.fileName += ".xml";
		}*/
		
		try {
			this.ouvrir();
		} catch (JDOMException e) {
			this.newXMLFile();
		} catch (IOException e) {
			this.newXMLFile();
		}
	}
	
	public String getFileName() {
		return fileName;
	}
	
	
	/**
	 * Ouvre le fichier de sauvegarde des donnees
	 * 
	 * @throws JDOMException
	 * @throws IOException
	 */
	private void ouvrir() throws JDOMException, IOException {
		
		SAXBuilder sxb = new SAXBuilder();  
		document = sxb.build(new File(fileName));
	    root = document.getRootElement();
	}
	
	/**
	 * Ajoute un nouveau {@link Contact} dans le fichier de sauvegarde
	 * @param contact {@link Contact} a ajouter
	 */
	public void addContact(Contact contact) {

		elementAdder = new JDomElementCreater(root.getChild("Contacts"));
		elementAdder.addElement(contact);
	}
	
	/**
	 * Ajoute le proprietaire du fichier de sauvegarde
	 * @param owner {@link Owner} a qui appartient le fichier de sauvegarde
	 * @throws IOException 
	 */
	public void addOwner(Owner owner) throws IOException {

		if (root.removeChild("Owner")) {
			elementAdder = new JDomElementCreater(root/*.getChild("Owner")*/);
			elementAdder.addElement(owner);
		} else {
			throw new IOException("ajout de l'Owner echouer...");
		}
	}
	
	/**
	 * Ajoute un {@link Event} dans le fichier de sauvegarde
	 * @param event {@link Event} a ajouter
	 */
	public void addEvent(Event event) {

		elementAdder = new JDomElementCreater(root.getChild("Events"));
		elementAdder.addElement(event);
	}
	
	/**
	 * Cree un fichier de sauvegarde vierge
	 */
	private void newXMLFile() {
		
		root = new Element("agenda");
		Element child = new Element("Contacts");
		root.addContent(child);
		child = new Element("Events");
		root.addContent(child);
		child = new Element("Owner");
		root.addContent(child);
		document = new Document(root);
	}
	
	/**
	 * Sauvegarde le fichier
	 */
	public void save() {
		
		try {
			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
			sortie.output(document, new FileOutputStream(fileName));
		} catch (IOException e) {
		}
	}
	
	/**
	 * Affichage du contenu du fichier de sauvegarde
	 */
	public void affiche()
	{
	   try
	   {
	      //On utilise ici un affichage classique avec getPrettyFormat()
	      XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
	      sortie.output(document, System.out);
	   }
	   catch (java.io.IOException e){}
	}


	/**
	 * @return the root
	 */
	public Element getRoot() {
		return root;
	}
}
